// Vector3D类的头文件
#ifndef VECTOR3D_H
#define VECTOR3D_H
// #include "core_lib_export.h"

#include <stdio.h>
#include <iostream>

// 顶点的3D向量表示。
class Vector3D
{
    friend class Matrix3x3;

  protected:
    double x;  // X坐标
    double y;  // Y坐标
    double z;  // Z坐标

  public:
    Vector3D();
    Vector3D(double x, double y, double z);
    ~Vector3D();

    // 访问器
    double getX();  // 返回X坐标
    double getY();  // 返回Y坐标
    double getZ();  // 返回Z坐标

    // 修改器
    void setX(double x);  // 设置X坐标
    void setY(double y);  // 设置Y坐标
    void setZ(double z);  // 设置Z坐标

    // 运算符重载
    // 注意: rhs表示右边操作数
    // 加法运算
    Vector3D operator+(Vector3D rhsVector);

    // 减法运算
    Vector3D operator-(Vector3D rhsVector);

    // 相等运算
    friend bool operator==(const Vector3D& lhsVector, const Vector3D& rhsVector);

    // 点积(返回单个值)
    double dot(Vector3D rhsVector);

    // 叉积(返回Vector3D)
    Vector3D cross(Vector3D rhsVector);

    // 标量乘法(Vector3D在左边)
    Vector3D operator*(double scalar);

    // 标量乘法(Vector3D在右边)
    friend Vector3D operator*(double scalar, Vector3D v);

    // 输出Vector3D
    friend std::ostream& operator<<(std::ostream& os, Vector3D& v);  // cout

    // 杂项函数
    // 返回两个顶点之间的距离
    double distance(Vector3D& v2);

    // 返回两个顶点之间的中点
    Vector3D midpoint(Vector3D& v2);
};

#endif /* VECTOR3D_H */